<?php
/*

*/

  /**
   * Fonctions sytèmes et paramètre systeme
   */

/**
 * Chargement automatique des classes utiles.
 */
function __autoload($className) // void
{
  // Autoinclusion des fichiers class utiles à chaque page
  if(file_exists('php/'.$className.'.php'))
    {
      include_once('php/'.$className.'.php');
    }
  else if(file_exists('../php/'.$className.'.php'))
    {
      include_once('../php/'.$className.'.php');
    }
}

/**
 * Traiter une exception en utilisant le template adapte
 *
 * @param exception $e exception a traiter
 */
function traiterException($e)
{
  global $CONF;
  global $err;
  require_once 'php/template.php';

  if(!isset($CONF['template']['exception']['page']) || !file_exists($CONF['theme_dir'].'/template/'.$CONF['template']['exception']['page']))
    {
      // Pas de modele pour afficher l'exception : mode affichage brut
      echo '<html><head></head><body><div>';
      echo $err[22];
      echo '<pre>'.$e->getNum().' : '.$e->getMessage().'</pre>';
      echo '</div></body></html>';
      exit(5);
    }
  
  $template = new Template($CONF['theme_dir'].'/template/');
  $template->set_filenames(array('leTemplate' => $CONF['template']['exception']['page']));
  
  // si c'est du XML
  if(isset($CONF['template']['exception']['xml']) && $CONF['template']['exception']['xml'] === true)
    {
      header("Content-Type: text/xml");
    }
  
  $template->assign_vars($e->returnArray());

  $template->pparse('leTemplate');

  exit(1);
}

/**
 * Compteur de milisecondes pour chronometrer le script.
 *
 * @return flotant $f temps en milisecondes
 */
function getMicrotime() // float
{
  // Fonction qui permet le calcul du temps de génération de la page (appel en début et fin de script)
  list($usec, $sec) = explode(' ', microtime());
  return ((float)$usec + (float)$sec);
}

/**
 * Transforme un nom de fichier en nom de fichier spécial
 *
 * @return string $n nom de fichier
 */
function trNomFichierUp($nom)
{
  return strtolower(time().'-'.basename(ereg_replace('[^a-zA-Z0-9\.]', '_', $nom)));
}

/**
 * Récupère le nom de fichier en enlevant l'extention et le chemin d'accès.
 * effectue d'autres petites transformations pour rendre le nom plus lisible
 *
 * @return string $n nom
 */
function trNomFichier($nom)
{
  $tmp1 = trim(basename(str_replace('_', ' ', $nom)));
  $tmp2 = explode('.', $tmp1);
  if(count($tmp2) > 1) array_pop($tmp2);
  return implode('.', $tmp2);
}

/**
 * Retourne les informations d'une date MySQL ou EXIF (pour permettre de la formatter apres)
 *
 * @param string $date MySQL ou EXIF
 * @return array $date array('y', 'm', 'd', 'h', 'n', 's');
 */
function trDate($date)
{
  $cpt  = 0;
  $res  = array('y'=>null, 'm'=>null, 'd'=>null, 'h'=>null, 'n'=>null, 's'=>null);
  $date = explode('-', ereg_replace('[^0-9]', '-', $date));
  $info = array('y', 'm', 'd', 'h', 'n', 's');
  foreach($date as $d)
    {
      $res[$info[$cpt++]] = $d;
    }
  return $res;
}

/**
 * Retourne les informations d'une date MySQL ou EXIF (pour permettre de la formatter apres)
 *
 * @param string $date MySQL ou EXIF
 * @return string $d date format français
 */
function trDateFr($date)
{
    $dtmp = trDate($date);
    return $dtmp['d'].'/'.$dtmp['m'].'/'.$dtmp['y'].' '.$dtmp['h'].':'.$dtmp['n'].':'.$dtmp['s'];
}

/**
 * Retourne l'extention du fichier
 *
 * @param string $nomFichier nom du fichier
 * @return string $ext extention trouvee (vide si pas d'extention)
 */
function trouveExtention($nomFichier) // string
{
  if(!eregi('\.',$nomFichier))
    {
      return '';
    }

  $t = explode('.', $nomFichier);
  return strtolower($t[count($t) - 1]);
}

/**
 * Retourne la version propre d'une varriable
 * 
 * @todo faire d'autres tests si besoin
 * @param mixed $var varriable à l'entrée
 * @param bool $int transforme en nombre entier à la volé
 * @return mixed $v varriable à la sortie
 */
function cleanVar($var, $int=false)
{
  // faire d'autres tests si besoin
  if(is_array($var))
    {
      $res = array();
      foreach($var as $clef => $value)
	{
	  $clefOK  = cleanVar($clef);
	  $valueOK = cleanVar($value);
	  if(($valueOK == 0 || !empty($valueOK)) && ($clefOK == 0 ||!empty($clefOK)))
	    {
	      if($int) $res[$clefOK] = (int)$valueOK;
	      else     $res[$clefOK] = $valueOK;
	    }
	}
      return $res;
    }
  else
    {
      if($int) return (int)trim(strip_tags($var));
      else     return trim(strip_tags($var));
    }
}

/**
 * Test si le fichier exists (voir file_exists).
 * Marche aussi avec les URLs
 *
 * @param string $fichier url ou chemin du fichier a tester
 * @param &bool $isFichier true si c'est un fichier false si c'est une url
 * @return bool $e
 */
function file_exists_url($fichier, &$isFichier=true)
{
  $isFichier = (!ereg('^http://', $fichier));

  if(@fclose(@fopen($fichier, 'r')))
    {
      return true;
    }
  return false;
}

/**
 * Transforme l'argument passé en tableau.
 *
 * @param mixed $mixed argument
 * @return array $r tableau résultat
 */
function makeArray($mixed)
{
  if(!is_array($mixed))
    {
      $mixed = array($mixed);
    }

  return $mixed;

}

/**
 *
 */
function index($p='')
{
    header('Location: index.php'.$p);
}

/**
 * Teste si la fonction existe bien,
 * en cas de problème charge la fonction de remplacement
 *
 * @param string $nom nom de la fonction à tester
 */
function function_ok($nom)
{
  if(!function_exists($nom))
    {
      $nomFonction = $nom;
      include('php/fonctions_plus.php');
    }
}

/**
 * Fonction de calcul md5 de fichier très très très rapide
 * mais elle n'est pas aussi fiable que le md5_file
 *
 * @param $fichier nom de fichier
 * @return md5
 */
function fast_md5_file($fichier)
{
  if(filesize($fichier)<120*5000) return md5_file($fichier);
  $f=fopen($fichier,'r');$c=0;$b='';
  while(!feof($f)&&$c++<100) $b.=fgets($f,4096);
  fseek($f,filesize($fichier)-5000);
  $b.=fgets($f, 4096);fclose($f);
  return md5($b);
}

/**
 * Fonction qui active les plugins correspondant au scope
 *
 * @param $scope scope correspondant à l'action
 * @param $objet objet sur lequel faire l'action
 */
function startPlugin($scope,$objet)
{
    global $PLUGINS;
    //var_dump($PLUGINS);exit;
    if (!empty($PLUGINS[$scope]))
        foreach($PLUGINS[$scope] as $v) {
            if(method_exists($v,$scope)) $v->$scope($objet);
        }
}


/**
 * Fonction qui récupère l'url du favicon d'un site web
 *
 * @param $url URL du site
 * Thanks to Favatars project (http://www.peej.co.uk/projects/favatars.html)
 */
function getFavicon($url)
{
  $HTTPRequest = @fopen($url, 'r');
  if ($HTTPRequest)
    {
      stream_set_timeout($HTTPRequest, 1.0);
      $html = fread($HTTPRequest, 4096);
      $HTTPRequestData = stream_get_meta_data($HTTPRequest);
      fclose($HTTPRequest);
      if (!$HTTPRequestData['timed_out'])
	{
	  if (preg_match('/&lt;link[^&gt;]+rel="(?:shortcut )?icon"[^&gt;]+?href="([^"]+?)"/si', $html, $matches) ||
	      preg_match('/<link[^&gt;]+rel="(?:shortcut )?icon"[^&gt;]+?href="([^"]+?)"/si', $html, $matches))
	    {
	      $linkUrl = html_entity_decode($matches[1]);
	      if (substr($linkUrl, 0, 1) == '/')
		{
		  $urlParts = parse_url($url);
		  $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].$linkUrl;
                }
	      elseif (substr($linkUrl, 0, 7) == 'http://')
		{
		  $faviconURL = $linkUrl;
                }
	      elseif (substr($url, -1, 1) == '/')
		{
		  $faviconURL = $url.$linkUrl;
                }
	      else
		{
		  $faviconURL = $url.'/'.$linkUrl;
                }
            }
	  else
	    {
	      $urlParts = parse_url($url);
	      $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].'/favicon.ico';
            }

	  $HTTPRequest = @fopen($faviconURL, 'r');
	  if ($HTTPRequest)
	    {
	      stream_set_timeout($HTTPRequest, 1.0);
	      $favicon = fread($HTTPRequest, 8192);
	      $HTTPRequestData = stream_get_meta_data($HTTPRequest);
	      fclose($HTTPRequest);
	      if (!$HTTPRequestData['timed_out'] && strlen($favicon) < 8192)
		{
		  return $faviconURL;
                }
            }
        }
    }

  return false;
}

?>
